package aarddict.android;

import android.view.View;

public class EinkScreen {
    /// variables
    public static int UpdateMode = 1;
    // 0 - CLEAR_ALL, set only for old_mode == 2
    // 1 - ONESHOT, always set in prepare
    // 2 - ACTIVE, set in prepare
    public static int UpdateModeInterval = 4;
    public static int RefreshNumber = -1;
    public static boolean IsSleep = false;
    // constants
    public final static int cmodeClear = 0;
    public final static int cmodeOneshot = 1;
    public final static int cmodeActive = 2;

    public static void PrepareController(View view, boolean isPartially) {
        if (isPartially || IsSleep != isPartially) {
            SleepController(isPartially, view);
            //                              if (isPartially)
            return;
        }
        if (RefreshNumber == -1) {
            switch (UpdateMode) {
            case cmodeClear:
                SetMode(view, cmodeClear);
                break;
            case cmodeActive:
                if (UpdateModeInterval == 0) {
                    SetMode(view, cmodeActive);
                }
                break;
            }
            RefreshNumber = 0;
            return;
        }
        if (UpdateMode == cmodeClear) {
            SetMode(view, cmodeClear);
            return;
        }
        if (UpdateMode > 0 && (UpdateModeInterval > 0 || UpdateMode == 1)) {
            if (RefreshNumber == 0 || (UpdateMode == cmodeOneshot && RefreshNumber < UpdateModeInterval)) {
                switch (UpdateMode) {
                case cmodeActive:
                    SetMode(view, cmodeActive);
                    break;
                case cmodeOneshot:
                    SetMode(view, cmodeOneshot);
                    break;
                }
            } else if (UpdateModeInterval <= RefreshNumber) {
                SetMode(view, cmodeClear);
                RefreshNumber = -1;
            }
            if (UpdateModeInterval > 0) {
                RefreshNumber++;
            }
        }

        return;
        /*
          if (UpdateMode == 1 && UpdateModeInterval != 0) {
          if (RefreshNumber == 0) {
          // быстрый режим, один раз устанавливается
          N2EpdController.setMode(N2EpdController.REGION_APP_3,
          N2EpdController.WAVE_GL16,
          N2EpdController.MODE_ACTIVE, view); // why not MODE_ACTIVE_ALL?
          } else if (UpdateModeInterval == RefreshNumber) {
          // одно качественное обновление для быстрого режима
          N2EpdController.setMode(N2EpdController.REGION_APP_3,
          N2EpdController.WAVE_GU,
          N2EpdController.MODE_CLEAR_ALL, view);
          RefreshNumber = -1;
          }
          RefreshNumber ++;
          }
        */
        //}
    }

    public static void ResetController(int mode, View view) {
        System.err.println("+++ResetController " + mode);
        switch (mode) {
        case cmodeClear:
            if (UpdateMode == cmodeActive) {
                RefreshNumber = -1;
            } else {
                RefreshNumber = 0;
            }
            break;
        case cmodeOneshot:
            RefreshNumber = 0;
            break;
        default:
            RefreshNumber = -1;
        }

        UpdateMode = mode;
    }
    public static void ResetController(View view) {
        if (UpdateMode == cmodeClear) { return; }
        System.err.println("+++Soft reset Controller ");
        SetMode(view, cmodeClear);
        RefreshNumber = -1;
    }

    public static void SleepController(boolean toSleep, View view) {
        if (toSleep == IsSleep) {
            return;
        }
        System.err.println("+++SleepController " + toSleep);
        IsSleep = toSleep;
        if (IsSleep) {
            switch (UpdateMode) {
            case cmodeClear:
                break;
            case cmodeOneshot:
                break;
            case cmodeActive:
                SetMode(view, cmodeClear);
                RefreshNumber = -1;
            }
        } else {
            ResetController(UpdateMode, view);
        }
        return;
    }

    private static void SetMode(View view, int mode) {
        switch (mode) {
        case cmodeClear:
            N2EpdController.setMode(N2EpdController.REGION_APP_3,
                                    N2EpdController.WAVE_GC,
                                    N2EpdController.MODE_ONESHOT_ALL);
            //                              N2EpdController.MODE_CLEAR, view);
            break;
        case cmodeOneshot:
            N2EpdController.setMode(N2EpdController.REGION_APP_3,
                                    N2EpdController.WAVE_GU,
                                    N2EpdController.MODE_ONESHOT_ALL);
            //                      N2EpdController.MODE_ONESHOT_ALL, view);
            break;
        case cmodeActive:
            N2EpdController.setMode(N2EpdController.REGION_APP_3,
                                    N2EpdController.WAVE_GL16,
                                    N2EpdController.MODE_ACTIVE_ALL);
            //                      N2EpdController.MODE_ACTIVE_ALL, view);
            break;
        }
    }
}
